/**
 * 
 */
package com.cn.practice.composite;

import java.util.ArrayList;
import java.util.List;

/**
 * 组合模式通常都是用来处理树形结构数据
 * 组合模式的核心是组合对象，定义几个抽象方法用于实现类实现
 * 非叶节点实现组合对象，并且实现类会聚合一个组合对象组成的集合
 * 叶节点只实现组合对象。由于不能往下迭代就没有集合
 * @author zhangyang
 *
 */
public class CompositePractice {
public static void main(String[] args) {
	FirstMenu sys = new FirstMenu("sys","系统管理");
	FirstMenu goods = new FirstMenu("goods","商品管理");
	SecondMenu user = new SecondMenu("user","用户管理");
	SecondMenu role = new SecondMenu("role","角色管理");
	SecondMenu goosinfo = new SecondMenu("goosinfo","商品信息");
	SecondMenu theme = new SecondMenu("theme","商品主题");
	API userAdd = new API("add","用户新增");
	API userUpdate = new API("update","用户修改");
	//三级菜单放入二级菜单
	user.add(userAdd);
	user.add(userUpdate);
	//二级菜单放入一级菜单
	sys.add(user);
	sys.add(role);
	goods.add(theme);
	goods.add(goosinfo);
	//打印所有系统管理菜单信息
	sys.print();
//	//da
//	user.print();
	}
}

/**
 * 菜单 抽象类
 * @author zhangyang
 *
 */
abstract class Menu{
	Long id;
	Long parentId;
	String menuCode;
	String menuName;
	String menuUrl;
	String icon;
	abstract void add(Menu menu);
	abstract void delete(Menu menu);
	abstract void update(Menu menu);
	abstract void print();
}

class FirstMenu extends Menu{
	
	
	public FirstMenu() {
		super();
	}
	
	public FirstMenu(String menuCode,String menuName) {
		this.menuCode=menuCode;
		this.menuName=menuName;
	}

	List<Menu> secondMenu=new ArrayList<>();
	@Override
	void add(Menu menu) {
		// TODO Auto-generated method stub
		secondMenu.add(menu);
	}

	@Override
	void delete(Menu menu) {
		// TODO Auto-generated method stub
		secondMenu.remove(menu);
	}


	@Override
	void update(Menu menu) {
		// TODO Auto-generated method stub
		/**
		 * 修改需要获取指定元素位置
		 */
		if(secondMenu.contains(menu)) {
			//修改
		}
	}

	@Override
	void print() {
		// TODO Auto-generated method stub
		System.out.println("====二级菜单=====");
		for(Menu menu:secondMenu) {
			System.out.println(menu.menuCode+"_"+menu.menuName);
			menu.print();
		}
	}
	
}

class SecondMenu extends Menu{
	
	public SecondMenu() {
		super();
	}
	
	public SecondMenu(String menuCode,String menuName) {
		this.menuCode=menuCode;
		this.menuName=menuName;
	}
	
	List<Menu> Apis=new ArrayList<>();
	@Override
	void add(Menu menu) {
		// TODO Auto-generated method stub
		Apis.add(menu);
	}

	@Override
	void delete(Menu menu) {
		// TODO Auto-generated method stub
		Apis.remove(menu);
	}


	@Override
	void update(Menu menu) {
		// TODO Auto-generated method stub
		/**
		 * 修改需要获取指定元素位置
		 */
		if(Apis.contains(menu)) {
			//修改
		}
	}

	@Override
	void print() {
		// TODO Auto-generated method stub
		System.out.println("====接口=====");
		for(Menu menu:Apis) {
			System.out.println(menu.menuCode+"_"+menu.menuName);
			menu.print();
		}
	}
	
}

class API extends Menu{
	
	public API() {
		super();
	}
	
	public API(String menuCode,String menuName) {
		this.menuCode=menuCode;
		this.menuName=menuName;
	}
	
	@Override
	void add(Menu menu) {
		// TODO Auto-generated method stub
		//Apis.add(menu);
	}

	@Override
	void delete(Menu menu) {
		// TODO Auto-generated method stub
		//Apis.remove(menu);
	}


	@Override
	void update(Menu menu) {
		// TODO Auto-generated method stub
	}

	@Override
	void print() {
		// TODO Auto-generated method stub
//		System.out.println("====接口=====");
//		System.out.println(this.menuCode+"_"+this.menuName);
	}
	
}